# 以下掌握基本类型

# String(字符串)
str = "HelloWorld"

# 字符串切片
print(str)  # 整个字符
print(str[0: -1])  # 不包含最后一个字符的所有字符
print(str[2: 5])  # 从第三个到第五个 左闭(包含) 右开(不包含)
print(str[2:])  # 从第三到最后
print(str[: -2])  # 从左到倒数第二个(不包含)
print(str * 2)  # 输出两次

print('=============警戒线===============')

# \ 为转义符  最开始加 r 会让 \ 失去转义作用
print('hel\nlo')
print(r'hel\nlo')

print('=============警戒线===============')


# bool(布尔类型)
if True:
    print('This will always print')

if not False:
    print('This will als always print')

x = 10
if x:
    print("x is non-zero")

print('=============警戒线===============')


# List(列表) 元素可修改 元素写在[]中
list = ['abcd', 789, 'nihao', 50.3]
tinyList = [123, 'wasei']

print(list) # 打印列表
print(list[0]) # 打印第一个元素
print(list[:]) # 打印所有元素 与 第一个相同
print(tinyList * 2) # 复制两次
print(list + tinyList) # 两个列表相加

print('=============警戒线===============')

# 修改列表元素
a = [1, 2, 3, 4, 6, 6]
a[4] = 5
a[1:3] = [7, 8]

print(a)

print('=============警戒线===============')

# 翻转字符串
def reverseWords(input):
    # 通过空格将字符串分隔符, 把各个单词分隔为列表
    inputWords = input.split(" ")

    # 翻转字符串
    # 第一个参数 -1 表示最后一个元素
    # 第二个参数为空, 表示移动到列表末尾
    # 第三个参数为步长, -1 表示逆向
    inputWords = inputWords[-1 :: -1]

    # 重新组合字符串
    output = ' '.join(inputWords)

    return output

if __name__ == "__main__":
    input = 'I Like Internet'
    rw = reverseWords(input)
    print(rw)


print('=============警戒线===============')


# Tuple(元组) 元素不可修改 元素写在()中
tuple = ('abcd', 156, 0.1, 'nihaoya', 50.7)
tinyTuple = ('我', 543)

print(tuple)  # 输出完整元组
print(tuple[0])  # 输出元组第一个元素
print(tuple[1: 3])  # 输出从下标为1 的元素到下标为3 的元素
print(tuple[2:])  # 输出从下标为2 的元素到最后
print(tinyTuple * 2)  # tinyTuple 输出两次
print(tuple + tinyTuple)  # 连接元组

print('=============警戒线===============')

testTuple = (tuple, list)
print(testTuple)

# 修改元组下列表中的元素
testTuple[1][2] = 123
print(testTuple)

tup1 = (1,)  # 创建的元组只有一个元素 需要加上 ,
tup2 = ()  # 空元组
print(tup1)
print(tup2)

print('=============警戒线===============')


# Set(集合)
# 1. 无序, 可变的数据类型
# 2. 存储唯一的元素
# 3. 使用{}表示
# 4. 也可以使用set() 函数创建集合
# 5. 空集合必须使用 set() 创建
sites = {'BaiDu', 1, 'TaoBao', 2, 'TianMao', 2, 1}
print(sites)  # 输出集合, 重复的元素自动去掉

# 成员测试
if 'TaoBao' in sites:
    print("TaoBao 在集合中")
else:
    print("TaoBao 不在集合中")

# set 可以进行集合运算
a = set('abracadabra')  # a b r c d
b = set('alacazam')  # a l c z m

print(a)
print(a - b)  # a 和 b 的差集   b r d
print(a | b)  # a 和 b 的并集   a b r c d l z m
print(a & b)  # a 和 b 的交集   a c
print(a ^ b)  # a 和 b 中不同时存在的元素  b r d l z m


print('=============警戒线===============')


# Dictionary(字典)
# 1. 无序的对象集合
# 2. 有映射, 使用{} 标识
# 3. 一种无序的key - value 的集合
# 4. key 必须使用不可变类型
# 5. key 必须是唯一的

dict = {}
dict['one'] = "1- 菜鸟教程"
dict[2] = "2- 菜鸟工具"

tinyDict = {'name' : 'niu', 'code' : 1, 'site' : 'www.baidu.com'}

print(dict['one'])      # 输出键为 'one' 的值
print(dict[2])      # 输出键为 2 的值
print(tinyDict)   # 输出完整的字典
print(tinyDict.keys())  # 输出所有的键
print(tinyDict.values())  # 输出所有的值

print('=============警戒线===============')


# 命令行可以使用dict() 函数构造字典
# dict([('百度' , 1), ('Google' , 2), ('YaHoo' , 3)])


print('=============警戒线===============')


# bytes 类型
# 1. 不可变的二进制序列
# 2. 整数值 0 - 255 之间的整数
# 3. 经常处理二进制数据, 如: 图像文件, 音频文件, 视频文件等
#    在网络编程中, 经常使用bytes 类型来传输二进制数据
# 4. 使用b 前缀的方式创建bytes 对象
# 5. 也可以使用bytes() 函数将其他类型的对象转换为bytes 类型
#    第一个参数是要转换的对象, 第二个参数是编码方式, 若省略, 默认为UTF-8 编码
x1 = bytes("hello", encoding = "utf-8")  # 5.

x = b"hello"
y = x[1:3]  # 切片操作, 得到b"el"
z = x + b"nihao"  # 拼接操作
print(z)

# ord() 函数用于将字符转换为相应的整数值
if x[0] == ord("h"):
    print("the first element is 'h'")














